package com.ethannhu.todaynews.activity

import android.util.Log
import com.ethannhu.superui.extension.longToast
import com.ethannhu.superui.extension.shortToast
import com.ethannhu.todaynews.AppContext
import com.ethannhu.todaynews.R
import com.ethannhu.todaynews.activity.BaseCommonActivity
import com.ethannhu.todaynews.component.login.LoginHomeActivity
import com.ethannhu.todaynews.entity.response.BaseResponse
import com.ethannhu.todaynews.model.BaseViewModel
import com.ethannhu.todaynews.util.PreferenceUtil
import com.loading.dialog.IOSLoadingDialog
import org.apache.commons.lang3.StringUtils
import retrofit2.HttpException
import java.lang.ref.WeakReference
import java.net.ConnectException
import java.net.SocketException
import java.net.SocketTimeoutException
import java.net.UnknownHostException


/**
 * 本项目的通用逻辑，列如：背景颜色等
 */
open class BaseLogicActivity : BaseCommonActivity() {
    private var loadingDialog: WeakReference<IOSLoadingDialog>? = null
    /**
     * 获取界面方法
     */
    protected val hostActivity: BaseLogicActivity
        get() = this

    override fun initViews() {
        super.initViews()

    }

    /**
     * 初始化通用 ViewModel逻辑
     */
    protected fun initViewModel(viewModel: BaseViewModel) {
        //关闭界面
        viewModel.finishPage.observe(this) {
            finish()
        }
        //本地提示
        viewModel.tip.observe(this) {
            onTip(it)
        }
        //异常
        viewModel.exception.observe(this) {
            onException(it)
        }
        //网络响应业务失败
        viewModel.response.observe(this) {
            onResponse(it)
        }
        //加载提示
        viewModel.loading.observe(this) {
            if (StringUtils.isNotBlank(it)) showLoading(it) else hideLoading()
        }
    }

    fun onTip(data: Int) {
        data.shortToast()
        onError()
    }

    fun onResponse(data: BaseResponse) {
        when (data.status) {
            401 -> {
                R.string.error_not_auth.longToast()
                AppContext.instance.logout()
            }

            403 -> {
                R.string.error_not_permission.longToast()
            }

            404 -> {
                R.string.error_not_found.longToast()
            }
        }
        (data.message ?: getString(R.string.error_unknown)).longToast()
        onError()

    }

    fun onException(data: Throwable) {
        "出问题了，但是没判断是出了什么问题".longToast()
//        if (NetworkUtils.isAvailableByPing()) {
//            //有网络
//            R.string.error_load.longToast()
//        } else {
//            //提示，你的网络好像不太好
//            R.string.error_network_not_connect.longToast()
//        }

//        when (data) {
//            is SocketException -> {
//                //例如：服务器没有启动
//                R.string.error_connect_server.longToast()
//            }
//
//            is UnknownHostException -> {
//                //域名无法解析，例如：域名写错了
//                R.string.error_unknown_host.longToast()
//            }
//
//            is SocketTimeoutException -> {
//                //连接超时，例如：网络特别慢
//                R.string.error_network_timeout.longToast()
//            }
//
//            is ConnectException -> {
//                //以下情况都会触发该异常：
//                //服务器没有开启
//                //本地网络关闭
//                if (SuperNetworkUtil.isNetworkConnected(hostActivity)) {
//                    //本地有网络
//
//                    //提示连接服务端失败
//                    R.string.error_connect_server.longToast()
//                } else {
//                    //本地没有网络
//
//                    //提示，你的网络好像不太好
//                    R.string.error_network_not_connect.longToast()
//                }
//            }
//
//            is HttpException -> {
//                //http异常，例如：服务端返回401，403
//                handleHttpError(data)
//            }
//
//            is IllegalArgumentException -> {
//                //本地参数错误
//                R.string.error_illegal_argument.shortToast()
//            }
////            is ClientException -> {
////                "阿里云OSS客户端错误：${data.localizedMessage}".longToast()
////            }
////            is ServiceException -> {
////                "阿里云OSS服务端错误：${data.localizedMessage}".longToast()
////            }
//            else -> {
//                R.string.error_unknown.shortToast()
//            }
//        }

        onError()
    }

    private fun handleHttpError(data: HttpException) {
        AppContext.instance.getString(R.string.error_server_unknown_code, data.code()).shortToast()
    }


    open fun onError() {

    }

    /**
     * 显示加载对话框
     */
    open fun showLoading(data: String = getString(R.string.loading)) {
        if (loadingDialog == null || loadingDialog!!.get() == null) {
            loadingDialog = WeakReference(
                IOSLoadingDialog()
                    .setOnTouchOutside(false)

            )
        }

        val dialogData = loadingDialog!!.get()
        dialogData?.setHintMsg(data)
        if (dialogData!!.dialog == null || !dialogData!!.dialog!!.isShowing) {
            dialogData!!.show(supportFragmentManager, "LoadingDialog")
        }
    }

    /**
     * 隐藏加载对话框
     */
    fun hideLoading() {
        loadingDialog?.get()?.dismiss()
    }

    /**
     * 只要用户登录了，才会执行代码块
     *
     * @param data
     */
    fun loginAfter(data: Runnable) {
        if (PreferenceUtil.isLogin()) {
            //已经登录了
            data.run()
        } else {
            hostActivity.toLogin()
        }
    }

    fun toLogin() {
        startActivity(LoginHomeActivity::class.java)
    }

}